package stack

type Stack []int

type internalError struct {
	errMsg string
}

func (e internalError) Error() string {
	return e.errMsg
}

func New() *Stack {
	stk := Stack(make([]int, 0))
	return &stk
}

func (stk *Stack) push(val int) {
	*stk = append(*stk, val)
}

func (stk *Stack) pop() (int, error) {
	if len(*stk) == 0 {
		return 0, internalError{"stk empty!"}
	}
	val := (*stk)[len(*stk)-1]
	*stk = (*stk)[:len(*stk)-1]
	return val, nil
}

func (stk *Stack) size() int {
	return len(*stk)
}
